#ifndef _LIB_H_
#define	_LIB_H_

/** @file
 * Bibliothek mit einigen ausgewählten C Standardfunktionen.
 */

/**
 * vsnprintf ist das Arbeitstier der printf-Familie.
 * Wenn die Serielle Schnittstelle vorhanden ist, kann printf z.B. wie folgt
 * implementiert werden:
 * <pre>
 * void printf (char *str, ...) {
 *     char dest [1024];
 *     int* argp = (int*) (PTR_ADDR(&str) + sizeof(int));
 *     vsnprintf(dest, 1024, str, argp);
 *     write(dest);
 * }  
 * </pre>
 *
 *  @param dest : Puffer für erzeugten String
 *  @param maxlen : Anzahl der maximalen zu schreibenden Zeichen (inkl \0)
 *  @param format : Standard Formatstringt
 *  @param argp : Zeiger auf das 1. Element der Parameterliste
 *
 *  @return Gesamtanzahl geschriebener Zeichen + Nullbyte
 */
int 
vsnprintf( char *dest, int maxlen, const char *format, int *argp );

/**
 * memset füllt den Speicherbereich mit vorgegebenen Werten auf
 *
 * @param s : Zieladresse
 * @param c : Wert zum füllen des Speichers
 * @param n : Länge des zu füllenden Speicherstückes
 *
 * @return Anfangsadresse des gefüllten Speicherbereiches
 */
void *
memset (void *s, char c, unsigned long n);

/**
 * memcpy kopiert die Bytes eines Speicherbereiches in einen zweiten 
 * Speicherbereich.
 *
 * @param t : Zieladresse
 * @param src : Quelladresse
 * @param size : Anzahl zu kopierender Bytes
 */
void 
memcpy(void *t, const void *src, unsigned long size) ;

/**
 * strcpy kopiert einen String. 
 * <b>Vorsicht: ist der Zielpuffer zu klein, werden andere wichtige
 *    Speicherbereiche überschrieben. Besser strncpy verwenden
 * </b>
 *
 * @param d : Zielpuffer
 * @param s : zu kopierender String
 *
 * @return Zeiger auf Zielpuffer
 */
char *
strcpy(char *d, const char *s);

/**
 * Die Funktion strncpy kopiert maximal n Zeichen des Eingabestrings 
 * in ein Zielstring.
 *
 * @param d : Zielpuffer
 * @param s : Eingabestrings
 * @param len : maximal zu kopierende Zeichen
 *
 * @return Zeiger auf Zielpuffer
 */
char *
strncpy(char *d, const char *s, int len);

/**
 * strcmp vergleicht zwei Strings
 * @param a : 1. String
 * @param b : 2. String
 *
 * @return 0: falls a und b gleich sind<br>
 *         <0: falls a kleiner als b<br> 
 *         >0: falls a größer als b
 */
int 
strcmp(const char *a, const char *b);

/**
 * strncmp vergleicht maximal n Zeichen zweier Strings
 * @param src : 1. String
 * @param dest : 2. String
 * @param n : Anzahl der zu vergleichenden Zeichen
 * @return 0 : falls src und dest identisch sind<br>
 *        <0 : falls dest kleiner als src<br>
 *        >0 : falls dest g als src<br>
 */
int 
strncmp(const char *a, const char *b, int n);

/**
 * strlen ermittelt die Länge eines Strings anhand des '0'-Zeichens
 * 
 * @param s : nullterminierter String
 * @return Länge des Strings s
 */
int 
strlen(const char *s);

/**
 * atoi wandelt einen String in einen int-Wert um.
 *
 * @param s : String mit numerischen Zeichen
 * @return int-Wert, wenn String mit numerischen Zeichen beginnt
 */
int 
atoi( const char *s );

#endif // _LIB_H_

